package com.zf.jdk_new;

import java.lang.reflect.RecordComponent;
import java.util.List;

/**
 * Jdk16新特性正式：
 * - instanceof 模式匹配 成为正式特性
 * - record 成为的正式特性
 * - Stream转List增强
 */
public class Jdk16Release {
    public static void main(String[] args) {
        testInstanceof();
        System.out.println("=========");
        testRecord();
        System.out.println("=========");
        testSteamToList();
    }

    /**
     * instanceof 增强
     */
    public static void testInstanceof() {
        Object a = Integer.parseInt("23");
        System.out.println("old-------");
        // 旧写法，手动类型转换
        if (a instanceof Integer) {
            Integer t = (Integer) a;
            t++;
            System.out.println(t);
        }

        //新写法 类型符合则指定变量名后就可以直接转为对应类型的对象
        if (a instanceof Integer temp) {
            temp++;
            System.out.println(temp);
        }

    }


    /**
     * record类
     * 在 java.lang.Class 增加了两个公共方法用于获取 Record 类信息：
     * - RecordComponent[] getRecordComponents(); // 获取record类的对象属性，也就是类名后的()里的属性信息
     * - boolean isRecord(); // 判断类是不是record类
     */
    public static void testRecord() {
        RecordTest recordTest = new RecordTest("张三", 22);
        System.out.println(recordTest);
        System.out.println(recordTest.name());
        System.out.println(recordTest.age());

        RecordComponent[] recordComponents = RecordTest.class.getRecordComponents();
        for (RecordComponent component : recordComponents) {
            System.out.println(component);
            System.out.println(component.getType()+": "+component.getName() + ": " + component.getGenericSignature());
        }
    }

    /**
     * record类，record修饰的类是 final的，且默认继承了 java.lang.Record, 所以record类不能再继承其他类。
     * 所有的对象属性也是 private final且只能写在类名的()里，且会自动生成 以属性名称命名的 get 方法，
     * 类内部只能定义静态（类）变量或常量。
     * record类自动生成public的 hashcode 、equals、toString 方法，
     * 自动生成全参的构造方法，且自定义的构造方法必须 直接或者间接 调用全参的构造方法。
     * <p>
     * 当属性太多时，定义看起来不太好看了，个人觉得record类用处不大，不如用 lombok 的 Data 注解
     */
    record RecordTest(String name, Integer age) {
        // String gender; 不能在类内部定义对象属性
        public static String gender; // 只能在类内部定义类属性

        // 自定义构造方法，必须直接或者间接调用全参构造
        public RecordTest(String name){
            this(name, null);
        }
    }

    /**
     * Stream转List增强
     */
    public static void testSteamToList() {
        List<String> list = List.of("qq", "ww", "uu", "ww");

        // Stream.toList() 获得的List是不可变的
        // Stream.collect(Collectors.toList()) 获取的List是可变的
        // Stream.toList()的性能在各方面依然都要好于Collectors下的方法
        List<String> result = list.stream()
                .toList();
        System.out.println(result);
    }
}
